package gruppo12.msp;

import gruppo12.msp.elaboration.*;
import gruppo12.msp.data.GestioneFile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;

/**
 * 
 * Classe che implementa l'interfaccia relativa alla visita del PDI, quindi
 * mostra informazioni sul PDI selezionato </p>
 * 
 * @author Duca Antonio, Festa Jacopo, Fiorilli Domenico, Granese Dante, Lemma
 *         Saverio, Lombardi Marco e Pierno Fiore
 *         <p>
 */
public class VisualizzaItinerarioActivity extends Activity {
	private Elaborazione elaborazione;
	private Pianificazione pianificazione;
	private ArrayList<PDI> itinerario;

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		/* Dichiarazioni */
		Intent intent;
		String pkg;
		Resources res;
		Button bottoneVisualizzaPDImappa, bottoneRicercaManuale, bottoneProsegui, bottoneVisitaPDI;
		MappaCategorie mappaCategorie;
		HashMap<String, String> hashMapIngIta;
		LinearLayout layoutItinerario;
		LinearLayout.LayoutParams llp;
		RadioGroup radioGroup;
		LinearLayout linearSeparator;
		TextView textViewSeparatore;
		RatingBar ratingBar;
		PDI pdi;
		final boolean daFile;

		/* Recupero dei dati della precedente schermata */
		intent = getIntent();
		pkg = getPackageName();
		res = getResources();
		elaborazione = (Elaborazione) intent.getSerializableExtra(pkg
				+ ".elaborazione");
		pianificazione = (Pianificazione) intent.getSerializableExtra(pkg
				+ ".pianificazione");
		daFile = intent.getBooleanExtra(pkg + ".daFile", false);

		/* Associazione con gli oggetti grafici dell'xml */
		setContentView(R.layout.visualizzaitinerario);
		bottoneVisualizzaPDImappa = (Button) findViewById(R.id.buttonVisualizzaPDIMappa);
		bottoneRicercaManuale = (Button) findViewById(R.id.buttonRicercaManuale);
		bottoneProsegui = (Button) findViewById(R.id.buttonProsegui);
		bottoneVisitaPDI = (Button) findViewById(R.id.buttonVisitaPDI);
		layoutItinerario = (LinearLayout) findViewById(R.id.linearLayoutItinerario);

		/* Inizializzazioni variabili */
		mappaCategorie = new MappaCategorie(res);
		hashMapIngIta = mappaCategorie.getIngIta();
		itinerario = new ArrayList<PDI>();
		itinerario = pianificazione.getItinerario();

		radioGroup = new RadioGroup(this);

		/*
		 * Se gli oggetti elaborazione e pianificazione non sono stati caricati
		 * da file, si effettua il salvataggio
		 */
		if (!daFile)
			GestioneFile.salva(elaborazione, pianificazione);

		/* Commesso viaggiatore sulla lista dei PDI selezionati dall'utente */
		itinerario = pianificazione.commessoViaggiatore(elaborazione);

		/* Ciclo per la creazione dinamica dell'interfaccia */
		Iterator<PDI> iteratorePDI = itinerario.iterator();
		while (iteratorePDI.hasNext()) {
			pdi = iteratorePDI.next();

			/* Generazione RadioButton */
			final RadioButton radioButton = new RadioButton(this);
			/* Set del nome del pdi nel RadioButton */
			if (hashMapIngIta.get(pdi.getCategoria().getNomeCategoria()) != null)
				radioButton.setText(pdi.getNome()
						+ "\n"
						+ hashMapIngIta.get(pdi.getCategoria()
								.getNomeCategoria()));
			else {
				pdi.getCategoria().setNomeCategoria("Altro");
				radioButton.setText(pdi.getNome() + "\n"
						+ pdi.getCategoria().getNomeCategoria());
			}

			/* Associazione oggetto da modellare all'oggetto da modellare */
			radioButton.setTag(pdi);

			/* Oggetti radioButton inizialmente tutti visibili */
			radioButton.setEnabled(true);

			/* Generazione della linea di separazione per ogni checkbox */
			textViewSeparatore = new TextView(this);
			textViewSeparatore.setBackgroundColor(Color.BLACK);
			textViewSeparatore.setHeight(2);
			linearSeparator = new LinearLayout(this);
			linearSeparator.addView(textViewSeparatore);

			/* Generazione delle stelle per il rating */
			LinearLayout layoutRating = new LinearLayout(this);
			llp = new LinearLayout.LayoutParams(
					ViewGroup.LayoutParams.FILL_PARENT,
					ViewGroup.LayoutParams.WRAP_CONTENT);
			layoutRating.setLayoutParams(llp);

			/* Generazione RatingBar */
			ratingBar = new RatingBar(this, null,
					android.R.attr.ratingBarStyleIndicator);

			/* RatingBar non modificabili */
			ratingBar.setIsIndicator(true);
			ratingBar.setNumStars(5);
			ratingBar.setStepSize((float) 0.1);
			layoutRating.addView(ratingBar);
			/* Controllo sul rating pieno e vuoto */
			try {
				ratingBar.setRating(pdi.getRating());
			} catch (Exception e) {
				ratingBar.setRating(0);
			}
			radioGroup.addView(radioButton);
			radioGroup.addView(layoutRating);
			radioGroup.addView(linearSeparator);

			/* Listener del RadioButton */
			radioButton
					.setOnCheckedChangeListener(new OnCheckedChangeListener() {
						public void onCheckedChanged(CompoundButton buttonView,
								boolean isChecked) {

							if (isChecked) {
								PDI pdiScelto = (PDI) radioButton.getTag();
								elaborazione.setPdi(pdiScelto);
							}
						}
					});

			/*
			 * Se il PDI e' stato visitato, il relativo RadioButton non sara'
			 * visibile
			 */
			if (pdi.getVisitato() == true) {
				radioButton.setEnabled(false);
			}

		}
		/* Aggiunta del RadioGroup al layout */
		layoutItinerario.addView(radioGroup);

		/* Esecuzione del controllo sulla terminazione dell'itinerario */
		controlloTerminazionaItinerario();

		/* Listener del button bottoneProsegui */
		bottoneProsegui.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				startVisualizzaPercorsoActivity();
			}
		});

		/* Listener del button bottoneVisualizzaPDImappa */
		bottoneVisualizzaPDImappa
				.setOnClickListener(new View.OnClickListener() {
					public void onClick(View v) {
						startVisualizzaPDIMappaActivity();
					}
				});

		/* Listener del button bottoneVisitaPDI */
		bottoneVisitaPDI.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				startVisitaPDIActivity();
			}
		});

		/* Listener del button bottoneRicercaManuale */
		bottoneRicercaManuale.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				startRicercaManualeActivity();
			}
		});
	}

	

	/**
	 * <p>
	 * Metodo che controlla se sono stati visitati i PDI. In tal caso viene
	 * mostrato a video un Dialog che permette il ritorno alla schermata Home
	 * </p>
	 */
	private void controlloTerminazionaItinerario() {

		Iterator<PDI> pdiIteratore = itinerario.iterator();
		int controllo = 0;
		while (pdiIteratore.hasNext()) {
			PDI pdi = (PDI) pdiIteratore.next();
			if (pdi.getVisitato() == true)
				controllo++;
		}
		Log.i("Controllo = " + controllo, "Size = " + itinerario.size());
		if (controllo == itinerario.size()) {
			AlertDialog.Builder builderTermina = new AlertDialog.Builder(this);
			builderTermina
					.setMessage("Itinerario terminato, torna alla Homepage")
					.setCancelable(false)
					.setPositiveButton("OK",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int id) {
									GestioneFile.cancella();
									startTerminaActivity();
								}
							});
			final AlertDialog alertTermina = builderTermina.create();
			alertTermina.show();
		}

		/* Se non sono stati visitati tutti i PDI */
		else {
			boolean trovato = false;
			Iterator<PDI> iteratorePDI1 = itinerario.iterator();
			while (iteratorePDI1.hasNext() && !trovato) {
				PDI pdiScelto = iteratorePDI1.next();
				if (pdiScelto.getVisitato()) {
					if (pdiScelto.getNome() != null)
						Log.i("PDI visitati: ", pdiScelto.getNome());
				} else {
					elaborazione.setPdi(pdiScelto);
					trovato = true;
					if (pdiScelto.getNome() != null)
						Log.i("Ultimo PDI non visitato: ", pdiScelto.getNome());
				}
			}
		}
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alla Visualizzazione del Percorso
	 * </p>
	 */
	private void startVisualizzaPercorsoActivity() {

		Intent intent = new Intent(this, VisualizzaPercorsoActivity.class);
		String pkg = getPackageName();
	
		intent.putExtra(pkg + ".elaborazione", elaborazione);
		intent.putExtra(pkg + ".pianificazione", pianificazione);
		startActivity(intent);
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alla Visualizzazione dei PDI su
	 * Mappa
	 * </p>
	 */
	private void startVisualizzaPDIMappaActivity() {

		pianificazione.setItinerario(itinerario);
		Intent intent = new Intent(this, VisualizzaPDIMappaActivity.class);
		String pkg = getPackageName();
		
		intent.putExtra(pkg + ".elaborazione", elaborazione);
		intent.putExtra(pkg + ".pianificazione", pianificazione);

		startActivity(intent);
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alla Visita del PDI
	 * </p>
	 */
	private void startVisitaPDIActivity() {

		pianificazione.setItinerario(itinerario);
		
		Intent intent = new Intent(this, VisitaPDIActivity.class);

		String pkg = getPackageName();
	
		intent.putExtra(pkg + ".elaborazione", elaborazione);
		intent.putExtra(pkg + ".pianificazione", pianificazione);
		startActivity(intent);
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alla Ricerca Manuale
	 * </p>
	 */
	private void startRicercaManualeActivity() {

		pianificazione.setItinerario(itinerario);
		Intent intent = new Intent(this, RicercaManualeActivity.class);

		String pkg = getPackageName();
		
		intent.putExtra(pkg + ".elaborazione", elaborazione);
		intent.putExtra(pkg + ".pianificazione", pianificazione);

		startActivity(intent);
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alla Terminazione dell'Itinerario
	 * </p>
	 */
	private void startTerminaActivity() {

		Intent intent = new Intent(this, MobileSocialPlanningActivity.class);
		startActivity(intent);

	}
}